home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / recio214.zip / RCBPUT.C < prev    next >
C/C++ Source or Header  |  1996-06-14  |  4KB  |  118 lines

  1. /*****************************************************************************
  2.    MODULE: rcbput.c
  3.   PURPOSE: recio column delimited integral number output functions
  4. COPYRIGHT: (C) 1994-1996, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.14
  8.   RELEASE: June 14, 1996
  9. *****************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "recio.h"
  16.  
  17. extern int _risready(REC *rp, int mode);
  18. extern int _rputc(REC *rp, int ch);
  19.  
  20. #define rfp(rp)          ((rp)->r_fp)
  21. #define rcol(rp)         ((rp)->r_colno)
  22. #define rfldch(rp)       ((rp)->r_fldch)
  23. #define rflags(rp)       ((rp)->r_flags)
  24.  
  25. #define uint             unsigned int
  26. #define ulong            unsigned long
  27. #define UNSIGNED         0
  28. #define SIGNED           1
  29.  
  30. /****************************************************************************/
  31. static void                  /* return nothing                              */
  32.     _rcbputl(                /* put integral number to col delim rec stream */
  33.         REC   *rp,           /* pointer to record stream                    */
  34.         size_t begcol,       /* field inclusive beginning column            */
  35.         size_t endcol,       /* field inclusive ending column               */
  36.         int    base,         /* base (radix) (2 to 36)                      */
  37.         int    sign,         /* signed number?                              */
  38.         long   num)          /* number to put to stream                     */
  39. /****************************************************************************/
  40. {
  41.     size_t sl;               /* length of _r_nsbuf */
  42.  
  43.     if (_risready(rp, R_WRITE)) { 
  44.         if (endcol>=begcol && begcol>=rcolno(rp)) {
  45.             if (base>=2 && base<=36) {
  46.                 rfldno(rp)++;
  47.                 rflags(rp) &= ~_R_TXT;
  48.  
  49.                 /* if colno < begcol, pad with spaces */
  50.                 while (rcolno(rp) < begcol) {
  51.                     if (_rputc(rp, ' ')) goto done;
  52.                 }
  53.  
  54.                 /* based on sign, select conversion function */
  55.                 if (sign) {
  56.                     ltoa(num, _r_nsbuf, base);
  57.                 } else {
  58.                     ultoa((ulong)num, _r_nsbuf, base);
  59.                 }
  60.  
  61.                 /* if converted string fits space */
  62.                 sl = strlen(_r_nsbuf); 
  63.                 if (sl <= (endcol-begcol+1)) { 
  64.  
  65.                     /* right justify string */
  66.                     while (rcolno(rp) <= endcol-sl) { 
  67.                         if (_rputc(rp, ' ')) goto done; 
  68.                     }
  69.                 
  70.                     /* output converted string */
  71.                     if (fputs(_r_nsbuf, rfp(rp))==EOF) { 
  72.                         rseterr(rp, R_ENOPUT); 
  73.                     } else { 
  74.                         rcol(rp) += sl; 
  75.                     } 
  76.  
  77.                 /* else converted string too long for space */
  78.                 } else { 
  79.                     rsetwarn(rp, R_WWIDTH); 
  80.                     while (rcolno(rp) <= endcol) { 
  81.                         if (_rputc(rp, '*')) goto done;
  82.                     } 
  83.                 } 
  84.  
  85.             } else { 
  86.                 rseterr(rp, R_EDOM);
  87.             }
  88.         } else { 
  89.             rseterr(rp, R_EINVAL);
  90.         } 
  91.     } 
  92. done:
  93.     return; 
  94. }
  95.  
  96. /****************************************************************************/
  97. /* column delimited integral number output functions                        */
  98. /****************************************************************************/
  99. void rcbputi(REC *rp, size_t begcol, size_t endcol, int base, int num)
  100. {
  101.     _rcbputl(rp, begcol, endcol, base, SIGNED, (long) num);
  102. }
  103.  
  104. void rcbputui(REC *rp, size_t begcol, size_t endcol, int base, uint num)
  105. {
  106.     _rcbputl(rp, begcol, endcol, base, UNSIGNED, (long) num);
  107. }
  108.  
  109. void rcbputl(REC *rp, size_t begcol, size_t endcol, int base, long num)
  110. {
  111.     _rcbputl(rp, begcol, endcol, base, SIGNED, num);
  112. }
  113.  
  114. void rcbputul(REC *rp, size_t begcol, size_t endcol, int base, ulong num)
  115. {
  116.     _rcbputl(rp, begcol, endcol, base, UNSIGNED, (long) num);
  117. }
  118.